package com.laf.manage.controller.user;

import com.laf.common.core.controller.BaseController;
import com.laf.common.core.domain.R;
import com.laf.common.utils.SecurityUtils;
import com.laf.common.validation.ValidGroup;
import com.laf.manage.constant.LostItemStatusConstant;
import com.laf.manage.domain.dto.LostItemDTO;
import com.laf.manage.domain.dto.PageDTO;
import com.laf.manage.domain.dto.RollbackDTO;
import com.laf.manage.domain.query.LostItemQuery;
import com.laf.manage.domain.vo.ItemDetailsVO;
import com.laf.manage.domain.vo.LostItemVO;
import com.laf.manage.enums.QrTypeEnum;
import com.laf.manage.service.ILostItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 失物管理Controller
 *
 * @author zian
 * @date 2024-11-01
 */
@Slf4j
@Api(tags = "失物管理管理")
@RestController("userLostItemController")
@RequestMapping("/user/lost-item")
@RequiredArgsConstructor
public class LostItemController extends BaseController {


    private final ILostItemService lostItemService;


    /**
     * 分页查询待领取物品
     *
     * @param query
     * @return
     */
    @GetMapping("/wait-picked/page")
    @ApiOperation("分页查询待领取物品")
    public R<PageDTO<LostItemVO>> getWaitPickedItemList(LostItemQuery query) {
        log.info("获取失物列表 参数有：{}", query);
        // 添加查询条件
        query.setStatus(LostItemStatusConstant.WAIT_PICKED);
        query.setCreateUserId(null);
        PageDTO<LostItemVO> vos = lostItemService.getLostItemList(query);
        return R.ok(vos);
    }


    /**
     * 根据id获取失物详情
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id获取失物详情")
    public R<ItemDetailsVO> getLostItemDetails(@PathVariable Long id) {
        log.info("根据id获取失物详情 参数有：{}", id);
        ItemDetailsVO detailsVO = lostItemService.getDetailsById(id, false);
        return R.ok(detailsVO);
    }


    /**
     * 分页查询自己的失物
     *
     * @param query
     * @return
     */
    @GetMapping("/current/page")
    @ApiOperation("自己的失物列表信息")
    public R<PageDTO<LostItemVO>> getCurrentLostItemList(LostItemQuery query) {
        Long userId = SecurityUtils.getMobileUserId();
        query.setCreateUserId(userId);
        log.info("获取自己的失物列表 参数有：{}", query);
        PageDTO<LostItemVO> vos = lostItemService.getLostItemList(query);
        return R.ok(vos);
    }

    /**
     * 添加失物
     *
     * @param dto
     * @return
     */
    @PostMapping
    @ApiOperation("添加失物")
    public R addLostItem(@RequestBody @Validated(ValidGroup.Crud.Create.class) LostItemDTO dto) {
        log.info("添加失物 参数有：{}", dto);
        lostItemService.addLostItem(dto, false);
        return R.ok();
    }

    /**
     * 修改失物
     *
     * @param dto
     * @return
     */
    @PutMapping
    @ApiOperation("修改失物")
    public R updateLostItem(@RequestBody @Validated(ValidGroup.Crud.Update.class) LostItemDTO dto) {
        log.info("修改失物 参数有：{}", dto);
        lostItemService.editLostItem(dto, false);
        return R.ok();
    }


    /**
     * 获取提交码  根据id生成二维码
     */
    @GetMapping("/submitCode/{id}")
    @ApiOperation("生成提交码")
    public R generateSubmitCode(@PathVariable Long id) {
        log.info("生成提交码 参数有：{}", id);
        String base64 = lostItemService.generateCode(id, QrTypeEnum.SUBMIT_CODE);
        return R.ok(base64);
    }

    /**
     * 获取领取码
     */
    @GetMapping("/pickCode/{id}")
    @ApiOperation("生成领取码")
    public R generatePickCode(@PathVariable Long id) {
        log.info("生成提交码 参数有：{}", id);
        String base64 = lostItemService.generateCode(id, QrTypeEnum.PICKED_CODE);
        return R.ok(base64);
    }


    /**
     * 撤回
     */
    @PutMapping("/rollback")
    @ApiOperation("用户撤回")
    public R rollback(@RequestBody RollbackDTO dto) {
        log.info("用户撤回 参数有：{}", dto);
        lostItemService.rollback(dto, false);
        return R.ok();
    }

}
